'use strict'

/**
 * 根据路由标识加载对应的模块，
 * routes.js中的path属性是路由标识，module属性是模块的相对路径（路径相对于main.js）
 * @param [string] route [路由标识]
 */
define(['routes', 'tools', 'jquery'], (routes, tools, $) => {
    return route => {
        let eleIndex = tools.hasElement({ path: route }, routes, 'path') // 判断元素是否已存于数组中，并返回元素的索引
        let module = '' // 路由模块的相对路径
        if (-1 == eleIndex) { // 路由标识在routes.js中找不到
            $('.content-right').html('')
            return
        }
        module = routes[eleIndex].module
        require([module, 'libs/pannels/pannels'], (module, pannels) => { // 加载模块
            // 渲染template
            $('.content-right').html(module.template)
            // 把模块data、methods等选项的属性挂载到模块实例下
            let mdlInstance = {} // 模块实例
            for (let key in module.data) { // 把模块data选项的每一个属性挂载到模块实例下
                mdlInstance[key] = module.data[key]
            }
            for (let key in module.methods) { // 把模块method选项的每一个属性挂载到模块实例下
                mdlInstance[key] = module.methods[key]
            }
            // 根据节点的标签类型，执行相应的处理函数
            $('.content-right *').each((index, element) => {
                let tagName = element.tagName.toLowerCase() // 节点的标签类型
                let matched = false // 是否匹配到标签类型
                for (let tag in pannels) {
                    if (tag.toLowerCase() == tagName) {
                        let doPannel = pannels[tag] // 当前控件的处理函数
                        doPannel($(element), mdlInstance)
                        matched = true
                        break
                    }
                }
                if (!matched) { // 标签类型没有匹配上
                    let doPannel = pannels.common // 用通用控件的函数处理
                    doPannel($(element), mdlInstance)
                }
            })
        })
    }
})